package com.briup.day19;

public class ThreadTest3 {
    public static void main(String[] args) throws InterruptedException {
        // 有三个线程，分别输出 thread1 thread2 thread3
        // 要求thread3必须先于thread2，thread2必须先于thread1执行
        Thread t3 = new Thread(() -> {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("thread3");
        });
        Thread t2 = new Thread(() -> {
            try {
                // 当t2线程获取到时间片执行任务时，执行到本行代码，
                // 会直接让t3线程进入到运行状态，而t2线程直接进入到无限等待状态，直到t3线程的任务执行完毕
                // t2线程才会从休眠状态转换为可运行的状态
                t3.join();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("thread2");
        });
        Thread t = new Thread(() -> {
            try {
                t2.join();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("thread1");
        });
        t3.start();
        t2.start();
        t.start();
    }

    private static void test() {
        Thread t = new Thread(() -> {
            System.out.println("hello 1");
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("这是t1线程");
        });
        Thread t2 = new Thread(() -> {
            System.out.println("hello 2");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("这是t2线程");
        });
        // 设置线程的优先级为最低
        t.setPriority(1);
        // 优先级最高为10
        t2.setPriority(5);
        // 我们创建的线程默认就是前台线程，前台线程的好处在于必须让
        // 线程的任务执行完毕之后，程序才能结束执行；
        // 后台线程（精灵线程|守护线程）：用于执行保证程序运行的逻辑，如垃圾回收器
        // 后台线程无论任务是否执行完毕，主要程序到了需要关闭时，都会直接关闭
        t.setDaemon(true);

        // 将main线程的优先级设置为最大
        Thread.currentThread().setPriority(10);
        t.start();
        t2.start();
    }
}
